# 第七章 用户输入和 while 循环
# 大多数程序旨在解决最终用户的问题，因此通常需要从用户哪里获取一些信息。
# 假设有人要判断自己是否达到了投票年龄。
# 这种唱程序需要让用户输入 input 年龄
from turtle import TurtleGraphicsError

# 在本章中，你将学习如何接受用户输入，让程序对其进行处理。当程序需要一个名字时，你要提示用户输入该名字
# 你还将学习如何在需要时让程序不断地运行，以便用户尽可能多的输入信息，然后在程序中使用这些信息。

# 7.1 input() 函数的工作原理 --- 在 程序运行框内输入（与C语言一样）
# input() 函数让程序暂停运行，等待用户输入一些文本。获取用户输入后，Python将其赋给一个变量，以便使用

# message1 = input("Tell me something, and I will repeat it back to you:")
# print(message1)

# input() 函数接受一个参数，即要像用户显示的提示(prompt), 让用户知道该输入什么养的信息。
# 注意：有些文本编辑器不能运行提示用户输入的程序。你可使用这些文本编辑器提示用户输入的程序，但必须从终端运行他们

# 7.1.1 编写清晰的提示

# 每当使用 input() 函数时，都应指定清晰易懂的提示，准确地指出希望用户提供和什么样的信息

# name = input("Please enter your name: ")
# print(f"\n Hello, {name}")

# 有时候，提示可能超过一行。例如：你可能需要指出获取特定输入地原因。
# 这种情况下，可先将提示赋给一个变量，再将这个变量传递给 input() 函数
# 这样，即使提示超过一行，input 语句也会非常清晰

# prompt = "If you share your name, we can personalize the messages you see."
# prompt += "\nWhat is your first name?"
#
# name = input(prompt)
#
# print(f"\nHello, {name}")

# 这个示例中演示了一中创建多行字符串的方式。
# 第一行将消息的前半部分赋给变量 prompt。
# 在第二行中，运算符 += 在赋给变量prompt 的字符串末尾追加一个字符串

# 最终的提示占两行，且问号后面有一个空格，这也是为了使其更加清晰：

# 7.1.2 使用 int() 来获取数值输入

# 使用input() 函数时，Python会将用户输入解读为字符串。

# age = input("How old are you?")
# print(age)

# 用户输入的时数字 21，但当我们请求Python 提供变量 age 的值时，它返回的是 '21' —— 用户输入的数值用字符串表示
# 当试图用 该输入的数值用于比较时，Python 会报错，因为字符串和整数无法进行比较

# 为了解决这个问题，可使用 int() 函数将输入的字符串转换为 数值（强制类型转换）

# age = input("How old are you?")
# print(age)
#
# if int(age) >= 18:
#     print("您已经成年！")
# else:
#     print("您还未成年！")

# 7.1.3 求模运算符

# 在处理数值信息时，求模运算符 （%） 是一个很有用的工具

### —————— 7、2 while 循环简介
# for 循环用于针对集合中的每个元素执行一个代码块，而while循环则不断的运行，直到指定的条件不再满足为止

# 7.2.1 使用while 循环
# 使用 while 循环来数数

current_number = 1
while current_number <= 5:
    print(current_number)
    current_number += 1

# 7.2.2 让用户选择核实退出

# 可以使用 while 循环让程序在用户愿意时不断地运行
# 在程序中定义一个退出值，只要用户输入的不是这个值，程序就一直运行：

# prompt = "\nTell me something, and I will repeat it back to you:"
# prompt += "\nEnter 'quit' to end the program."
#
# message = ""  # 变量的初始值为 空字符串
# while message != 'quit':
#     message = input(prompt)
#
#
# # 修改程序，在退出时不打印 quit
#     if message != 'quit':
#         print(message)

# 7.2.3 使用标志
# 在上一个示例中，我们让程序在满足指定条件时执行特定的任务。
# 但是在复杂的程序中，有很多不同的事件会导致程序停止运行。在这种情况下，该怎么办呢？

# 在要求满足很多条件下才继续运行的程序中，可定义一个变量，用于判断整个程序是否处于活动状态。
# 这个变量称为标志（flag）
# 充当程序的交通信号灯
# 可以让程序在标志为 True 时继续运行，并在任何时间导致标志值为False 时让程序停止运行。
# 这样，在while循环中就应当添加一个检查条件，检查标志的当前值

# prompt = "\nTell me something, and I will repeat it back to you:"
# prompt += "\nEnter 'quit' to end the program."
# active = True
# while active:
#     message = input(prompt)
#
#     if message == 'quit':
#         active = False
#     else:
#         print(message)

# 将变量 active 设置为 True， 让程序最初处于活动状态。这样做简化了 while 语句，因为不需要在其中做任何比较，只需要检查标志位就可以

# 7.2.4 使用break 退出循环

# 如果不管条件测试的结果如何，想立即退出 while循环，不再运行循环中的余下代码，可使用 break 语句
# break 语句用于控制程序流程。

# prompt = "\nTell me something, and I will repeat it back to you:"
# prompt += "\nEnter 'quit' to end the program."
#
# while True:
#     city = input(prompt)
#
#     if city == 'quit':
#         break
#     else:
#         print(f"I'd love to go to {city.title()}!")

# 在python循环中都可以使用 break，用以跳出循环

# 7.2.5 在循环中使用 continue
# 要返回循环开头，并根据条件测试的结果决定是否继续执行循环，可使用 continue 语句
# 他不像 break 语句那样不再执行余下的代码并退出整个循环。
# continue 是 跳出本次循环，忽略本次循环中余下的代码。

# 例如，从 1 数到 10 ，只打印其中的奇数：

current_number = 0
while current_number < 10:
    current_number += 1
    if current_number % 2 == 0:
        continue
    print(current_number)

# 7.2.6 避免无限循环
# 每个while 循环都必须有结束运行的途径，这样才不会没完没了地执行下去

x = 1
while x <= 5:
    print(x)
    x += 1

# 如果少了 x += 1，这条语句，那么x将永远无法达到终止循环的条件

# 每个程序员都会偶尔不小心地编写出无限循环，在循环地退出条件比较微妙时，尤其如此
# 如果程序陷入无线循环，既可按 Ctrl+C结束，也可以关闭显示程序输出的终端窗口

# 7、3 使用 while 循环处理列表和字典

# 到目前为止，我们每次都只处理了一项用户信息：获取用户的输入，再将输出打印出来或做出响应；
# 循环再次运行时，获取另一个输入值并作出响应。
# 要记录大量用户和信息，需要在while 循环中使用 列表和字典

# for 循环是一种遍历列表地有效方式，但不应该在 for循环中修改列表，否则将导致 Python难以跟踪其中地元素
# 要在遍历列表的同时修改它，可以使用 while 循环

# 7.3.1 在列表之间移动元素

# 假设有一个列表包含新注册但还未验证地网站用户。验证这些用户后，如何将他们移到已验证用户列表中呢？
# 一种办法是使用一个 while 循环，在验证用户地同时，将其从未验证用户列表中提取出来，再将其加入已验证用户列表

# 首先创建一个待验证用户列表
# 和一个用于存储已验证用户地空列表

unconfirmed_users = ['alice', 'brian', 'candace']
confirmed_users = []

# 验证每个用户，知道没有未验证的用户为止
# 将每个经过验证的用户都移到已验证用户列表中

while unconfirmed_users: # 当列表为空列表时，列表名地返回值为 False
    current_user = unconfirmed_users.pop()
    #  pop()方法 —— （如果括号中不指定元素索引）默认删除列表的最后一个元素，同时更新列表，但可以将新建一个变量将这个被删除的变量保存下来并继续使用它

    print(f"Verifying user: {current_user.title()}")
    confirmed_users.append(current_user)

# 显示所有的已验证用户
print("\n The following users have been confirmed:")
for confirmed_user in confirmed_users:
    print(confirmed_user)

# 7.3.2 删除为特定值的所有列表元素

# 在第三章中，我们使用了 remove() 函数来删除列表中的特定值
# 这之所以可行，是应为要删除的值在列表中只出现了依次
# 现在要删除列表中所有为特定值的元素，使用 while 循环

pets = ['dog', 'cat', 'dog', 'goldfish', 'cat', 'rabbit', 'cat']
print(pets)

while 'cat' in pets:
    pets.remove('cat')

print(pets)


# 7.3.3 使用用户输入填充字典

# 可以使用while 循环提示用户输入任意多的信息

responses = {}
# 设置一个标志，指出调查是否继续
polling_cative = True

while polling_cative:
    # 提示属入被调查者的名字和回答
    name = input("\nWhat is your name? ")
    response = input("Which mountain would you like to climb someday? ")

    # 将回答存储在字典中
    responses[name] = response

    # 看看是否还有人要参与
    repeat = input("Would you like to let another person respond? (yes/no) ")

    if repeat == 'no':
        polling_cative = False

# 结束调查，显示结果
print("\n........Poll Results.........")
for name, response in responses.items():
    print(f"{name} would like to climb {response}.")




































































































